﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace GanagroLiteBO
{
    static class WhereClauseBuilder
    {
        public static string BuildWhereClause(ReportArgs rArgs)
        {
            string whereClause = string.Format(" WHERE {0} {1} {2}", GetActivosInactivosClause(rArgs),
                                                GetRangoFecha(rArgs), GetRangoCodigos(rArgs));
            return whereClause;
        }

        public static string GetRangoFecha(ReportArgs rArgs)
        {
            string strSql = string.Empty, sFecha1 = string.Empty, sFecha2 = string.Empty;
            string compFF = getFechaCompareOperator(rArgs.MatchesFechaF);

            switch (rArgs.ReportNumber)
            {
                case EnumReportes.VentasVsCompras:
                    sFecha1 = "Fecha_compra";
                    sFecha2 = "Fecha_venta";
                    break;
                case EnumReportes.GananciaVida:
                case EnumReportes.GananciaPeriodo:
                    sFecha1 = "FechaInicial";
                    sFecha2 = "FechaFinal";
                    break;
                case EnumReportes.Inventario:
                    sFecha1 = "1";
                    sFecha2 = "1";
                    break;
                case EnumReportes.Ceba:
                    strSql = rArgs.MatchesFechaI ? string.Format(" AND FECHA1 = '{0}'", rArgs.FechaI.ToString()) : string.Empty;
                    strSql = strSql + string.Format(" AND FECHA3 {0} '{1}'", compFF, rArgs.FechaF.ToString());
                    return strSql;
                default:
                    sFecha1 = "Fecha";
                    sFecha2 = "Fecha";
                    break;
            }

            strSql = string.Format(" AND {0} {1} '{2}'", sFecha1, (rArgs.MatchesFechaI ? "=" : ">="), rArgs.FechaI.ToString());
            strSql = strSql + string.Format(" AND {0} {1} '{2}'", sFecha2, compFF, rArgs.FechaF.ToString());

            return strSql;
        }

        public static string getFechaCompareOperator(EnumCompararFecha ecf)
        {
            string str = "<=";
            switch (ecf)
            {
                case EnumCompararFecha.menor:
                    str = "<";
                    break;
                case EnumCompararFecha.menorOigual:
                    str = "<=";
                    break;
                case EnumCompararFecha.igual:
                    str = "=";
                    break;
                case EnumCompararFecha.mayorOigual:
                    str = ">=";
                    break;
                case EnumCompararFecha.mayor:
                    str = ">";
                    break;
                default:
                    break;
            }

            return str;

        }

        public static string GetRangoCodigos(ReportArgs rArgs)
        {
            string strSql = string.Empty;

            try
            {

                string[] lCodigos = rArgs.Codigos.Split((new Char[] { ';' }));
                string codI; string codF;
                string cods2;
                if (lCodigos.Count(p => p.Length > 0) == 0)
                {
                    return string.Empty;
                }

                foreach (string cods in lCodigos)
                {
                    if (cods.Contains('-'))
                    {
                        codI = cods.Substring(0, cods.IndexOf('-')).Trim();
                        codF = cods.Substring(cods.IndexOf('-') + 1).Trim();
                        strSql = strSql + string.Format(" AND CODIGO >= '{0}'", codI);
                        strSql = strSql + string.Format(" AND CODIGO <= '{0}'", codF);
                    }
                    else
                    {
                        cods2 = cods.Replace(" ", string.Empty);
                        cods2 = cods2.Replace(",", "','");
                        cods2 = string.Format("'{0}'", cods2);
                        strSql = strSql + string.Format(" OR CODIGO IN ({0}) ", cods2);
                    }
                }

                if (strSql.Trim().StartsWith("OR"))
                {
                    strSql = " AND " + strSql.Trim().Substring(2);
                }
            }
            catch
            { strSql = string.Empty; }

            return strSql;
        }

        public static string GetActivosInactivosClause(ReportArgs rArgs, string prefijo = "")
        {
            string strSql = "1=1 ";

            if (rArgs.IncluirActivos && !rArgs.IncluirInactivos)
            {
                strSql = string.Format("{0}CODIGO IN (SELECT CODIGO FROM GANADO WHERE ACTIVO = 1)", prefijo);
            }

            if (!rArgs.IncluirActivos && rArgs.IncluirInactivos)
            {
                strSql = string.Format("{0}CODIGO IN (SELECT CODIGO FROM GANADO WHERE ACTIVO = 0)", prefijo);
            }

            return strSql;
        }


    }
}
